#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>



/*-------------Déplacement du fichier à compresser-------------------*/
void copier_fichier(char nom[])
{
	FILE *SOURCE, *DEST;
	char *nom_dest; /* Chemin absolu du fichier � compresser */
	char nomfich[90]; /* Nom du fichier � compresser */
	char charlu;
	int i;

	/* R�cuperation du nom de fichier */
	for(i=strlen(nom);(charlu=nom[i])!='\\';i--);
	strcpy(nomfich,&nom[i]);

	if( (nom_dest=( (char *)malloc(sizeof(char)* (10+strlen(nomfich))) ) ) ==NULL)
	{
		perror("Erreur =>malloc fonction copier_fichier() ");
		exit(EXIT_FAILURE);
	}

	strcpy(nom_dest,"C:\\");
	strcat(nom_dest,nomfich);

	/* Ouverture des fichiers */
	if((SOURCE=fopen(nom,"rb"))==NULL)
	{
		perror("Erreur => ouverture fichier fonction copier_fichier() ");
		exit(EXIT_FAILURE);
	}
	if((DEST=fopen(nom_dest,"wb"))==NULL)
	{
		perror("Erreur =>ouverture fichier fonction copier_fichier()");
		exit(EXIT_FAILURE);
	}

	while(fread(&charlu, sizeof(char), 1, SOURCE))
		fwrite(&charlu,sizeof(char),1,DEST);

	free(nom_dest); /* Lib�ration de l'espace m�moire */
	fclose(SOURCE); /* Fermeture des fichiers */
	fclose(DEST);
}

/*-------------------------Cr�ation du fichier frequence.txt--------------------*/
void creer_freq(unsigned int arbreN[], char nom[])
{
	FILE *FREQ;
	int i;
	char *nomfich;
	char nombre[12]; /* Fr�quence convertit en chaine de caract�res */

	/* Fabrication du nom du fichier */
	if( (nomfich=( (char *)malloc(sizeof(char)* (15+strlen(nom))) ) ) ==NULL)
	{
		perror("Erreur =>malloc fonction creer_freq() ");
		exit(EXIT_FAILURE);
	}
	strcpy(nomfich,nom);
	strcat(nomfich,"-frequence.txt");

	/* Création du fichier fréquence.txt */
	if( (FREQ = fopen(nomfich,"w")) == NULL )
	{
		perror("Erreur =>ouverture fichier frequence.txt ");
		exit(EXIT_FAILURE);
	}

	/* Ecriture dans le fichier */
	for(i=0;i<MAXCAR;i++)
	{
		fputc(i,FREQ);
		fputc(' ',FREQ);
		//itoa(arbreN[i],nombre,10); /* Conversion en chaine de caractère de l'occurence */
//ATTENTION ne pas utiliser itoa qui n'existe pas en "VRAI" C mais plutôt sont équivalent sprintf() ou snprintf()
		sprintf(nombre,"%d",arbreN[i]);	//cf. man sprintf
		fputs(nombre,FREQ);
		fputc('\n',FREQ);
	}
	free(nomfich);
	fclose(FREQ);
}


/*-------------------------Enregistrement dans le fichier codage.txt---------------------- */
void ecrire_codage(struct dictionaire dico[], char nom[])
{
	FILE *CODAGE;
	int i, j;
	int diff;
	char *nomfich;
	char nombre[30]; /* Codage de Huffman convertit en caract�re */

	/* Fabrication du nom du fichier */
	if( (nomfich=( (char *)malloc(sizeof(char)* (12+strlen(nom))) ) ) ==NULL)
	{
		perror("Erreur =>malloc fonction creer_freq() ");
		exit(EXIT_FAILURE);
	}
	strcpy(nomfich,nom);
	strcat(nomfich,"-codage.txt");

	if( (CODAGE=fopen(nomfich,"w"))==NULL)
	{
		perror("Erreur => ouverture fichier codage.txt ");
		exit(EXIT_FAILURE);
	}

	for(i=0;i<MAXCAR;i++)
	{
		if(dico[i].bits==0) /* On ignore les caract�res sans codage */
			continue;

		//itoa(dico[i].code,nombre,2);
		sprintf(nombre,"%d",dico[i].code);
		diff=0;
		/* Ajout des 0 devant la chaine */
		if(strlen(nombre)!=dico[i].bits)
		{
			diff=dico[i].bits-strlen(nombre);
			for(j=strlen(nombre);j>=0;j--)
				nombre[j+diff]=nombre[j];
			for(j=0;j<diff;j++)
				nombre[j]='0';

		}
		fputc(i,CODAGE);
		fputc(' ',CODAGE);
		fputs(nombre,CODAGE);
		fputc('\n',CODAGE);
	}
	free(nomfich);
	fclose(CODAGE);
}


/*-----------------------Fabrication du nom des fichiers----------------------*/
void extraire_nom(char nom[], struct arbre_huff *arbre, int choix, int taille, unsigned int taille_fich, short int nbfich)
{
	char nomfich[120]={0};

	/* Fabrication du nom original */
	strncat(nomfich,nom,strlen(nom)-4); /* Copie du nom de l'archive moins les 3 derniers caract�res */

	if(choix==2) /* Si l'archive contient un seul fichier */
		taille=decodage(nom,nomfich,arbre,taille,1);
}

/*---------------------Cr�ation de l'archive----------------------*/
void ecrire_fichier(unsigned int carac[], char nom[], unsigned short int nbfich, unsigned int taille, short int mark)
{
	FILE *ARCHIVE, *TMP;
	char *nom_archive;
	char *nom_tmp;
	short int charlu;
	short int i,j;

	for(j=strlen(nom);(charlu=nom[j])!='\\';j--); /* R�cup�ration du nom du fichier */
	/* Fabrication du nom des fichiers */
	if( (nom_archive=( (char *)malloc(sizeof(char)* (5+strlen(nom))) ) ) ==NULL)
	{
		perror("Erreur => malloc fonction ecrire_fichier() ");
		exit(EXIT_FAILURE);
	}
	if( (nom_tmp=( (char *)malloc(sizeof(char)* (12+strlen(&nom[j]))) ) ) ==NULL)
	{
		perror("Erreur => malloc fonction ecrire_fichier() ");
		exit(EXIT_FAILURE);
	}
	strcpy(nom_tmp,"C:\\");
	strcat(nom_tmp,&nom[j]);
	strcat(nom_tmp,".tmp");
	if (!nbfich) /* Nom de l'archive pour un fichier seul */
		strcpy(nom_archive,nom);
	else /* Si il s'agit du r�pertoire */
	{

	}
	strcat(nom_archive,".huff");

	/* Ouverture des fichiers */
	if( (TMP=fopen(nom_tmp,"rb"))==NULL)
	{
		perror("Erreur => ouverture fichier .tmp ");
		exit(EXIT_FAILURE);
	}
	if((ARCHIVE=fopen(nom_archive,"a+b"))==NULL)
	{
		perror("Erreur => cr�ation de l'archive ");
		exit(EXIT_FAILURE);
	}

	if(mark==0) /* 1 seul fichier ou premier fichier du repertoire */
	{
		fwrite(&nbfich,sizeof(short int),1,ARCHIVE); /* Nombre de fichiers dans l'archive 2 octets */

		/* Stockage des informations permettant de reconstituer l'arbre binaire */
		for(i=0;i<MAXCAR;i++)
		{
			if(!carac[i]) /* Si le caract�re n'apparait pas dans le fichier */
				continue;
			fwrite(&i,sizeof(char),1,ARCHIVE); /* Ecriture du caract�re */
			fwrite(&carac[i],sizeof(int),1,ARCHIVE); /* Nombre d'occurences du caract�re */
		}
		fputc(0,ARCHIVE); /* Caract�re nul qui s�pare l'ent�te des donn�es */
	}



	/* On recopie le fichier contenu dans tmp � la suite */
	while(!feof(TMP))
	{
		fread(&charlu,sizeof(char),1,TMP);
		fwrite(&charlu,sizeof(char),1,ARCHIVE);
	}
	free(nom_archive);
	free(nom_tmp);
	fclose(ARCHIVE);
	fclose(TMP);
}
